![]() |
Hlavní stránka |
Škola |
Doprava |
Táboření a kluby |
Reportáže |
Fotografie |
Témata |
Ostatní |
Rozcestník |
Ke stažení |
Sázky |
Návštěvní kniha |
Kalendář |
Kontakt |
![]() |
![]() ![]() ![]() |
![]() ![]() |
![]() Import dat do software R |
AbstraktPrvotní zpracování vstupních dat je samozřejmou součástí každé statistické analýzy, bez níž obvykle vůbec není možné přistoupit k samotným výpočtům, jež tvoří její jádro. Data mohou být různým způsobem poškozená nebo zaznamenaná v rozporu se zvolenou normou, k problémům dochází díky různým formám kódování textu, číselných hodnot nebo kalendářních dat, se kterými se lze v praxi setkat. Příspěvek se zabývá elementárními postupy importu (transformace) a kontroly dat z různých datových zdrojů do výpočetního prostředí statistického programovacího jazyka R, přibližuje rutinní postupy formátování a čištění dat a upozorňuje na nejobvyklejší chyby a úskalí při jejich zpracování. Nezabývá se samotným matematicko-statistickým zhodnocením dat, ale klade si za cíl zprostředkování praktických a potřebných postupů, které by mu měly ve všech případech předcházet. ÚvodNezbytnou součástí každé statistické analýzy je prvotní (před)zpracování dat, spočívající v jejich správném naformátování podle požadavků zvoleného softwarového nástroje, kontrole a případně opravě možných chyb a nedostatků ve vstupním datovém souboru a další úpravě dat (např. jednoduché přepočty, agregace, normalizace aj.) tak, aby byla vhodná pro následující krok, kterým je samotné matematicko-statistické zpracování dat a interpretace získaných informací. Z hlediska náročnosti může zpracování surových dat představovat jak (časově) zanedbatelnou součást rozsáhlejší analýzy, tak také majoritní díl veškeré analytické práce. A to nejen v závislosti na zvolených analytických metodách a kvalitě datového zdroje, ale také na vhodnosti zvoleného výpočetního prostředí, schopnostech datového analytika a v neposlední řadě na náhodných vlivech, které mohou způsobovat těžko předvídatelné (a někdy rovněž špatně odhalitelné) problémy při samotné analýze. Následující text podrobněji rozebírá a na příkladech demonstruje postupy, které jsou součástí prvotní analytické práce – předzpracování dat před samotnou statistickou analýzou – v případě využití statistického software R. Pozornost je věnována zejména problematickým momentům předzpracování dat, nicméně text předpokládá alespoň základní uživatelskou znalost práce se software R. RStatistické prostředí jazyka R je založené na starším jazyce nazvaném S, který spatřil světlo světa v 70. letech 20. století v proslulých Bellových laboratořích v USA. Programovací jazyk R má modulární rekurentní strukturu – veškeré funkce jsou uspořádány do dílčích balíků (packages obsahující data a funkce), které jsou samy psány v jazyce R. Složením vybrané kombinace balíků tedy lze dosáhnout takové množiny funkcí, která optimálně odpovídá konkrétní výpočetní potřebě, bez nutnosti zahlcovat počítač množstvím nevyužitích funkcí. Základní distribuce jazyka R (aktuálně v červenci 2015 verze 3.1.2.) je složena z 12 implicitních balíků (ty není třeba instalovat a připojovat samostatně):
Tyto balíky obsahují veškeré funkce potřebné pro základní práci s prostředím R a pro instalaci, připojení i vytváření dalších rozšiřujících balíků. Celkem je v oficiálním repozitáři CRAN (Comprehensive R Archive Network) v současnosti k dispozici téměř 7 000 rozšiřujících balíků, které lze jednoduše instalovat přímo z jeho webové stránky (to umožňuje zdarma sdílet jen stěží představitelné množství metod, nápadů a zkušeností dalších uživatelů, kteří je přetavili do podoby R balíků. S mírnou nadsázkou lze tvrdit, že není třeba vytvářet žádné další funkce, protože v balících R lze najít prakticky cokoliv). Vzhledem ke skutečnosti, že prostředí jazyka R je volně dostupné pod licencí GNU (Free Software Foundation’s GNU General Public Licence), dosahuje jeho použití enormní popularity a celosvětová komunita uživatelů R aktuálně přesahuje počet 2 000 000 osob. Největší síla jazyka R ovšem spočívá ve specificky statistickém zpracování velkých objemů dat ve formě tabulek a vektorů, jehož efektivita se blíží práci s relačními databázemi, ovšem při zachování všech specifik statistické práce a dostatečné uživatelské přívětivosti. R lze spouštět na všech obvyklých platformách operačních systémů UNIX, Windows, MacOS a jejich derivátech, pomocí vhodných balíků jej lze vestavět do webových stránek a využívat v rámci serverových víceuživatelských aplikací. Pro uživatelsky příjemné použití byla v roce 2011 vyvinuta open source platforma RStudio, kombinující syntaktický editor, konzoli jazyka R, prohlížeč proměnných, nápovědu, grafický výstup a další užitečné utility. Konzole vs. konzolaO slovním tvaru konzola vs. konzole pojednává zajímavý článek v bohemistickém časopise Naše řeč (viz http://nase-rec.ujc.cas.cz). RstudioRstudio je aplikace, zprostředkovávající rozhraní mezi uživatelem a samotným prostředím a jazykem R. Standardně je okno Rstudia rozděleno na čtyři obdélníkové části volitelných rozměrů, přičemž první část (vlevo nahoře) představuje inteligentní syntaktický editor s řadou užitečných funkcí oproti čistě textovému prostředí (obarvení kódu, řetězců a klíčových slov, možnost sbalit/rozbalit části kódu, kontrola uzávorkování aj.). Spouštění částí kódu se děje tradičně pomocí klávesové zkratky Ctrl + R, přičemž spuštěný kód se objevuje níže v okně konzole včetně případných varovných a chybových hlášek. Také v tomto okně je text částečně editovatelný (např. je možné z konzole vykopírovat výsledky ve formě textu).
Zbývající dvě okna nabízí větší množství záložek s různými funkcemi. Výše umístěné okno umožňuje např. prohlížet obsah proměnných v daném prostředí nebo procházet historii spuštěných příkazů, dolní okno pak zprostředkovává adresářovou strukturu, přehled instalovaných a připojených balíků, nápovědu a grafické výstupy několika typů. Rstudio navíc nabízí další užitečné funkce pro práci s kódem v jazyce R, jako je zakládání projektů (pro vytváření balíků), export grafů, instalace a připojení balíků přímo z repozitáře CRAN, vyhledávání v kódu, nápovědě a obsahu proměnných apod. Datové typy a třídy v RDříve než se pustíme do vlastního importu dat z různých zdrojů, je vhodné se podívat na nejobvyklejší datové typy a třídy, které má jazyk R v základní distribuci k dispozici. Nevhodně zvolený datový typ/třída je jedním z nejobvyklejších problémů, které řeší méně zkušení uživatelé při práci v jazyce R a proto je vhodné se datovým typům a třídám věnovat podrobněji před dalším výkladem. Vybrané datové typy objektů v R
Datové typy vycházejí z reprezentace proměnných v paměti počítače a pro většinu programovacích jazyků jsou podobné. Na rozdíl od tříd jsou datové typy konstruovány jako co nejuniverzálnější. Pro konkrétní specifickou potřebu je potom možné z těchto datových typů konstruovat složitější třídy (classes) ve smyslu tříd v objektově orientovaném programování (s dědičnými vlastnostmi apod.).
Základní datové typy, se kterými je možné se setkat na uživatelské úrovni při práci v R, jsou
Statistika je z velké části práce s čísly, proto je vhodné začít s pro analýzy nejobvyklejším datovým typem, který slouží v jazyce R pro ukládání číselných hodnot. Tímto datovým typem je reálné (desetinné) číslo neboli typ Datový typ double
Datový typ double umožňuje ukládání reálných čísel ve formátu s plovoucí desetinnou čárkou (floating point formát) a tzv. dvojitou přesností (datový typ
Mimo reálná čísla může proměnná typu Vytvořit lze proměnnou typu double jednoduše pomocí příkazu double (vrátí vektor nul o zadané délce) nebo vlastním přiřazením reálného čísla do proměnné:
promenna<-double(1) # argument oznacuje delku vektoru, 1 = skalar (jedno cislo) Stejně jako ve všech následujících příkladech lze ověřit pomocí funkce is.double, zda je daná proměnná typu double (funkce vrací logickou hodnotu):
is.double(promenna) # vrati hodnotu TRUE nebo FALSE Datový typ character
Datový typ určený pro ukládání textových řetězců v závislosti na zvoleném kódování. Počet znaků textového řetězce je libovolný od 0 (i prázdná proměnná může být typu
Vytvořit lze proměnnou typu
promenna<-character(1) # argument oznacuje delku vektoru (1 = jeden retezec)
Opět lze ověřit, zda je proměnná typu character pomocí funkce
is.character(promenna) Datový typ logical
Jak napovídá už sám název, slouží datový typ Další datové typy v R
Ze zbývajících datových typů uveďme ve stručnosti ještě univerzální typ
Pro zjištění datového typu objektu slouží v R jednoduchá funkce
promenna<-as.double(1) Vybrané třídy objektů v RV mnoha případech při ukládání hodnot do proměnných nevystačíme se základními datovými typy a potřebujeme data uspořádat do složitější struktury. Proto je možné ze základních datových typů konstruovat složitější třídy (classes), které přiřazujeme jednotlivým objektům. Na rozdíl od datových typů existuje tříd nepřeberné množství a v případě potřeby navíc běžně uživatelé definují další třídy. Uvedeme proto pouze několik nejdůležitějších a nejčastěji používaných tříd v R.
Podobně jako pro zjištění datového typu objektu využíváme funkci Třída numeric
Třída
Vytvořit lze proměnnou třídy
promenna<- numeric(1) # argument oznacuje delku vektoru, 1 = skalar (jedno cislo)
Pomocí funkce
is.numeric(promenna) # vrati hodnotu TRUE Třída character
Obdobně jako třída
Vytvořit lze proměnnou třídy
promenna<-character(1) # argument oznacuje delku vektoru (1 = jeden retezec)
Opět lze ověřit, zda je proměnná třídy character pomocí funkce
is.character(promenna) Třída DatePoměrně často je v praxi třeba zpracovávat údaje o kalendářním datu a čase. Zápis kalendářního data se v různém software a různých kulturních prostředích významně liší a tyto odlišnosti bývají jedním z nejčastějších zdrojů problémů při zpracování dat.
Datum je v prostředí R obvykle ukládáno jako typ
Přiřazení třídy Třída factorZajímavou třídou založenou na datovém typu integer je třída factor, sloužící ke kódování kategoriálních proměnných. Pro objekt třídy factor lze nadefinovat jednotlivé faktorové úrovně, které jsou následně očíslovány dle pořadí a prvky objektu jsou poté reprezentovány pořadovými čísly. To je vhodnější, než reprezentovat například konkrétní množinu barev jejich celými názvy: promenna<-factor(c("zluta","modra","zluta","bila")) # automaticky se vytvori urovne promenna # vypise nazvy kategorii odpovidajici prvkum as.integer(promenna) # vypise poradova cisla (podle abecedy) typeof(promenna) # datovy typ je integer Se třídou faktor se lze setkat často při importu dat, kde jsou proměnné některých datových typů načítány implicitně jako factor a pro další práci je obvykle nutné je konvertovat na jinou třídu. Třída data.frameSložitější strukturou, reprezentující dvourozměrně uspořádaná data je třída data.frame (datový rámec), reprezentovaná v podstatě tabulkou, v níž každý sloupec je představován jedním vektorem (všechny musí být stejné délky) s vlastní třídou (třídy vektorů v rámci se mohou lišit). Vytvářet lze datové rámce různými způsoby, nejjednodušší je využití funkce data.frame() nebo konverzní funkce as.data.frame(): promenna<-data.frame(c("Adamov","Babice","Brno"),c(4576,1095,378327)) # dva sloupce promenna<-data.frame(sloup1=c("Adamov","Babice","Brno"),sloup2=c(4576,1095,378327)) promenna<-as.data.frame(c(1,2,3)) # vytvori ramec s jednim sloupcem Na buňky rámce se pak lze odkazovat pomocí dvourozměrného indexování ve formě ramec[radek,sloupec]. Pro ověření třídy lze stejně jako v předchozích případech využít funkci is.data.frame(). is.data.frame(promenna) # vrati hodnotu TRUE class(promenna) # vrati hodnotu "data.frame" typeof(promenna) # vrati hodnotu "list" TIP: Potřebujete-li zjistit třídy jednotlivých sloupců datového rámce, nelze jednoduše využít funkci class(), která vrací třídu celého rámce, nýbrž je zapotřebí využít funkce lapply(), která aplikuje funkci class() zvlášť na každý sloupec rámce: lapply(promenna,class) # vrati tridy jednotlivych sloupcu ramce Třída matrixJiná, podobná dvourozměrná struktura je definována jako třída matrix (matice). Většina parametrů datových rámců a matic je totožná, hlavní rozdíl spočívá ve větší efektivitě uložení a zpracování dat ve formě matice. Současně ale matice musí splňovat podmínku stejného datového typu všech svých prvků (tedy řádků i sloupců), naproti tomu datový rámec může mít každý sloupec jiného datového typu. Jednoduše lze matici nadefinovat pomocí funkcematrix() :
promenna<-matrix(TRUE,4,3) # vytvori matici 4 × 3 se vsemi sloupci typu logical Konverze mezi třídamiAni v případě velmi dobře nedefinovaných tříd objektů se nelze vyhnout potřebě měnit třídy některých objektů (proměnných), zejména ve fázi importu a exportu dat. Může jít například o výpis číselných hodnot v textových řetězcích, konverzi kalendářních data zadaných ve formě textu nebo čísel, změnu matice na datový rámec aj.
V řadě případů je konverze mezi třídami zřejmá (např. konverze celých čísel ( Vybrané konverze mezi třídami
Konvertovat celá čísla na reálná a reálná na komplexní lze snadno pomocí funkcí
promenna<-c(0,2+3i,-1i) Výsledkem bude vektor reálných čísel 0, 2, 0, neboť imaginární část je úplně zanedbána. TIP: Při práci s komplexními čísly je vždy nutné zadávat před imaginární jednotkou násobitel, i v případě, kdy jde o jedničku. Zápis 1i bude interpretován jako jedna imaginární jednotka, naproti tomu zápis i jako proměnná pojmenovaná i. Obdobně dojde k ořezání neceločíselné části (tj. zaokrouhlení nahoru pro záporná a dolů po kladná čísla) v případě konverze reálných čísel na celá:
promenna<-c(1,2.2,9.99,-3.5,Inf)
Obdobně lze pokračovat k binární třídě
Zdánlivě jednoduchá je konverze reálných čísel na textové řetězce. Zde je pouze zapotřebí hlídat počet desetinných míst, která budou vytištěna. Počet platných cifer v tomto případě (na rozdíl od výpisu na konzoli) není ovlivněn globálním nastavením přesnosti pomocí funkce
as.character(c(0.142857142857142857142857142857,1/7,1000/7,pi)) # 15 platnych cifer Je tedy vhodné použít některou ze zaokrouhlovacích funkcí pro požadovaný počet desetinných míst: as.character(round(c(0.142857142857142857142857142857,1/7,1000/7,pi),3)) # 3 platne
TIP: Pro zaokrouhlování lze využít celou řadu funkcí, např.
Užitečná konverze je ve směru z třídy
promenna<-factor(c(1.5,-1.4,2.0,0.9))
V tomto případě se konvertují na třídu
promenna<-factor(c(1.5,-1.4,2.0,0.9))
Konverze textu (
promenna<-as.Date(c("2015-09-09","2015-9-9","0-1-1","-15-2-6","2015"))
TIP: V případě konverze číselných formátů na datum je možné rovněž využít funkci
promenna<-as.Date(c(16800),origin="1970-01-01") Bezproblémová bývá konverze z matice na datový rámec:
matice<-matrix(c("Adamov","Aš","Abertamy", V opačném směru je zapotřebí pohlídat, aby byly všechny sloupce vhodné třídy, konvertovatelné na výslednou třídu prvků matice:
ramec<-data.frame(c("Adamov","Babice","Brno"),c(4576,1095,378327))
Poslední užitečnou ukázkou je konverze více sloupců datového rámce najednou, pro niž nelze použít přímo příkaz pro konverzi, neboť by se narušila struktura rámce. Opět je nutné využít funkce
ramec<-data.frame(factor(c(1,5.5,99)),factor(c(-1,-6,-100))) # vytvoreni ramce
Na závěr je užitečné zmínit existenci funkce
class(type.convert(c("F"))) # vrati hodnotu "logical" Import dat do RPohlédneme-li na předzpracování dat optikou jazyka R, bude prvním krokem tohoto procesu import dat (zde přeskočíme předchozí kroky spočívající v designu a samotném provedení experimentu, zaznamenání a přenosu dat apod.). Přestože možných cest, kterými může import dat do software proběhnout, je více, obvykle půjde o jeden z následujících postupů:
Pomineme-li v následujícím textu první uvedený způsob, který je vhodný pouze pro nejmenší datové sady např. při ověřování metod nebo experimentování, má smysl se zabývat importem dat z různých druhů souborů a s tím souvisejícími problémy a nejednoznačnostmi, případně importem ze schránky operačního systému, webových stránek nebo databází.
Ve všech zmíněných případech, kterými se bude text nadále zabývat, půjde téměř výhradně o data uspořádaná ve dvourozměrných tabulkách různých druhů; nicméně řada popsaných metod a argumentů je platná také při načítání jednorozměrných struktur – zájemce o tento druh importu nicméně pouze odkazuji na dvojici funkcí
Rozdíl mezi funkcemi
expozice: uvedení do děje
Použitím příkazu
[1] "expozice:" "uvedení" "do" "děje" "kolize:"
tedy vektoru o devatenácti prvcích a třídě
Protože argument
Naproti tomu příkaz
[1] "expozice: uvedení do děje" "kolize: zařazení dramatického prvku" Import dat ze souborůNejjednodušší formou zápisu jsou data ve formě prostého textu, kde je dvourozměrná struktura určena oddělovači řádků a sloupců, případně přesnými, předem danými počty znaků v jednotlivých buňkách. Zatímco konce řádků obvykle nebývají problematické (v závislosti na software se používají obvykle pouze dva různé znaky pro ukončení řádků: CR (carriage return, ASCII 0x0D) a/nebo LF (line feed, ASCII 0x0A), které importní funkce bez potíží dekódují, oddělovače sloupců mohou být reprezentovány různými znaky, případně jsou sloupce určené daným pevným počtem znaků (což je obecně paměťově méně efektivní způsob zápisu, nicméně ve specifických aplikacích může znamenat vyšší efektivitu čtení/zápisu). To představuje jeden z nejčastějších problémů při čtení dat ze souborů. Import dat s oddělovači sloupců
Základní funkcí pro čtení datových tabulek s oddělovači sloupců je v jazyce R funkce
Adamov Babice Crhov
bude při použití funkce
V1 V2 V3
kde
Oddělovač sloupců však může mít podobu libovolného znaku. Například poněkud nepřehledný soubor
1.5,6.2,7.3
bude při nastavení oddělovače sloupců na znaménko tečky (
V1 V2 V3 V4
přičemž sloupce budou po řadě třídy
Vraťme se nyní k témuž souboru, ovšem s nastavením desetinného oddělovače na čárku (jak je obvyklé v kontinentální Evropě, jižní Americe, severní Asii a západní Africe ), tedy import provedeme pomocí funkce Čárka nebo tečka?Použití desetinné čárky, tečky (a arabské notace) je ve světě poměrně nepravidelně rozloženo, přičemž počty uživatelů obou znamének se přibližně rovnají. Podrobný článek poskytuje Wikipedie na adrese http://cs.wikipedia.org/wiki/Desetinn%C3%A1_%C4%8D%C3%A1rka.
V1 V2 V3 V4
a tedy zřejmě třídy jednotlivých sloupců tabulky byly identifikovány správně pořadě jako
Třetí příklad se stejným souborem může pouhou záměnou oddělovače sloupců a desetinného oddělovače vést ke zcela jiným hodnotám, přestože bude stejně jako předchozí výsledek formálně správný. Jeden soubor tedy na základě zvolené metody importu může poskytovat diametrálně odlišná data – určení správného postupu v takových případech (soubor bez záhlaví a bez specifikace tříd sloupců) závisí prakticky pouze na expertní znalosti datového souboru (kdo soubor vytvořil, v jaké zemi, v jakém software apod.) a je velmi obtížné až nemožné jej odvodit pouze ze samotných číselných hodnot. Použijme tedy nyní upravenou funkci
V1 V2 V3
kde všechny sloupce spadají automaticky do třídy Následující kombinace desetinných a sloupcových oddělovačů jsou široce užívány v praxi (uložení v těchto formách nabízí většina statistických software):
Zejména výše uvedený formát csv (hodnoty oddělené čárkou) je pro svoji jednoduchost a nezávislost na konkrétním software velice populární pro výměnu dat mezi různými aplikacemi a rovněž široce využívaný institucemi např. ve státní správě. Uvedené tři varianty jsou nejběžnější, lze se ovšem setkat i s dalšími „mutacemi“.
Díky vysoké frekvenci použití csv souborů obsahuje jazyk R v základní instalaci pro rychlejší práci dvě rozšíření funkce read.table(), které jsou s ní víceméně totožné a liší se pouze implicitními hodnotami argumentů sep, Čárka na konci řádkuPovšimněte si, že na konci druhého řádku (Zambie) přibyla za uvozovkami ještě čárka, která odděluje druhý od třetího sloupce, ve kterém ovšem není žádná hodnota. Kromě oddělovačů sloupců a řádků hraje ve všech uvedených typech souborů důležitou roli ještě třetí speciální znak, zjednodušeně nazýván uvozovky (quote). Jde o znak, který v sloupcích datového typu character umožňuje zapsat znaky právě dříve zmíněných oddělovačů, aniž by došlo ke zlomu řádku nebo sloupce. Nejčastěji jde o americké uvozovky (ASCII 0x22 ), případně jednoduché uvozovky (ASCII 0x27), možný je ale i jiný znak. Funkci uvozovek nejlépe osvětlí příklad načtení následující tabulky s oddělovačem sloupců čárka, kde první sloupce obsahuje název státu, druhý barvy na jeho vlajce a třetí moře omývající jeho pobřeží:
Turecko bílá, červená Černé, Středozemní Z tabulky je patrné, že druhý a třetí sloupec obsahují v textu buněk znak čárka, při zápisu za použití čárky jako oddělovače sloupců proto získáváme nečitelný záznam v podobě:
Turecko,bílá,červená,Černé,Středozemní
a po jeho načtení příkazem
V1 V2 V3 V4 V5
Je tedy zřejmě zapotřebí sdělit funkci
Turecko,"bílá,červená","Černé,Středozemní"
Import tabulky ze souboru lze nyní provést příkazem rozšířeným o specifikaci uvozovek nastavením argumentu quote na hodnotu "\"", tj. dvojitou uvozovku (zápis vyžaduje umístění zpětného lomítka před znak uvozovky, tak jak je vidět zde:
V1 V2 V3
Užitečnou možností, jak předejít problémům s automatickou identifikací tříd sloupců v importované datové tabulce, je přímá specifikace tříd pomocí argumentu
TIP: V případě, že mají všechny sloupce importované tabulky stejnou třídu, stačí zadat argumentu
Výhodou tohoto přístupu oproti ruční konverzi jednotlivých sloupců, při níž může docházet ke ztrátě informace (například pokud se pokusíme načíst sloupec obsahující reálná čísla jako třídu
Použití argumentu
4.76,12.11,34.5,8
bude standardním způsobem
V1 V2 V3 V4
kde sloupce jsou pořadě tříd
Vnutíme-li nyní ve funkci
TIP: Pokud by bylo zapotřebí se v posledním uvedeném příkladě zbavit semikvantitativních hodnot a získat všechny sloupce třídy
V takovém případě je vhodnější provést konverzi všech sloupců ručně pomocí příkazu
V1 V2 V3 V4 Nahrazení semikvantitativních hodnot jinými reálnými hodnotami (např. polovinou limitu) by pak předpokládalo práci s textovými řetězci třídy character (ponechávám čtenářům jako cvičení práce s řetězci, které není předmětem tohoto článku).
Obdobně je užitečné využití argumentu
Import dat s pevnou šířkou sloupceV některých případech je zavádění oddělovačů sloupců méně efektivní než stanovení hranic mezi sloupci na základě počtu znaků od začátku řádku. Taková varianta se využívá především v případech, kdy mají všechny hodnoty ve sloupci stejnou bitovou délku (např. stejně dlouhé normalizované kódy, čísla se stejnou přesností, logické hodnoty apod.).
Import tabulky je v takovém případě podstatně jednodušší a prakticky jedinou informací, která je zapotřebí, jsou šířky sloupců udávané v počtech znaků jako celá čísla (argument
Pro čtení souboru
Adamov 4576 3,77
který obsahuje tři sloupce pevné šířky s názvem obce, počtem obyvatel a plochou katastru (v km2) je zapotřebí odhadnout (nebo znát z dokumentace) šířky sloupců ve znacích – v tomto případě 11 pro název, 4 pro počet obyvatel a 5 pro katastrální rozlohu (s desetinným oddělovačem čárkou). Následně lze importovat soubor příkazem
V1 V2 V3
Výsledné třídy jsou
rodné číslo@příjmení@krevní skupina
se šířkami sloupců 10, 14 a 2 znaků zřejmě názvy 1. a 3. sloupce překračují šířky těchto sloupců, přesto je lze příkazem
rodné.číslo příjmení krevní.skupina
Za povšimnutí zde rovněž stojí názvy prvního a třetího sloupce, kde byly v průběhu importu mezery nahrazeny tečkami; jde o důsledek nastavení argumentu Import dat z jiných typů souborů
Předchozí podkapitola se zabývala výhradně načítáním dat z textových souborů, tj. takových souborů, kde je informace zakódována do čitelných znaků o konkrétní bitové délce. Často se lze nicméně setkat s různými druhy binárních souborů, ve kterých jsou data binárně reprezentována podle vlastního zvláštního klíče, a jejich převedení do formy textu nedává žádný smysl. Typickým zástupcem tohoto typu souborů jsou soubory typů Požadavky na další softwarePěkný a poměrně rozsáhlý přehled dostupných řešení a jejich požadavků na další software v počítači uvádí Nicola Sturaro Sommacal na webové stránce http://www.milanor.net/blog/?p=779. Tabulkový procesor Microsoft Excel je nejrozšířenějším software pro zpracování a ukládání dat a proto se práci s ním (nebo přinejmenším souborům vytvořeným jeho pomocí) v analytické praxi prakticky nelze vyhnout. Je tedy vhodné zmínit jak úskalí jeho použití pro zpracování dat (více o typických problémech způsobených nesprávným použitím Excelu v kapitole o typických problémech s importem dat), tak metody, jak efektivně excelovské soubory zpracovat v R.
Standardní formáty Potíže s JavouNa 64 bitových počítačích s OS Windows je obvykle nutné mít nainstalovánu Javu jak v 32 bitové (obvykle ve složce Program files (x86)), tak v 64 bitové verzi (obvykle složka Program files), dále vyhledat složku obsahující 64 bitovou verzi souboru jvm.dll a nastavit adresu této složky do globální proměnné JAVA_HOME v jazyce R pomocí příkazu Sys.setenv(JAVA_HOME="C:\\Program Files\\Java\\...adresa...\\"). Podrobně jsou (anglicky) návody na zprovoznění balíku rJava popsány na diskuzním fóru http://stackoverflow.com/questions/7019912/using-the-rjava-package-on-win7-64-bit-with-r.
V případě úspěšné instalace balíku
Uvažujme nyní následující soubor
Pomocí příkazu
kod nazev kredity prumer zmeneno
přičemž funkce
Problematika importu a také úprav a exportu do excelovských souborů pomocí balíku
Obecnější, nicméně méně komfortní způsob práce s excelovskými soubory vede cestou konverze souborů do některého z textových formátů (jako nejvhodnější se jeví formát Vložení dat ze schránky
Použitelnou variantou je rovněž kopírování dat přímo z listu tabulkového procesoru do R přes schránku operačního systému (nastavení argumentu
Ze znalosti parametrů uložení souboru v tabulkovém procesoru pak přímo vychází potřebné hodnoty argumentů funkce
Vlastní formáty pro ukládání dat v R
kod nazev
1 Bi7527 Analýza dat v R
do souboru
¬‹ }PÍ‚@ w-P‚Ž]ö : •WŁn ŃÉë D–`bŕ©WíAr›VS”ę2żß7ßĚě×ţĚöm `Ŕ™ŚSh22`‘ď%x– -kđAé }ÜŹd&Ł+E#ÝŞ«ăr>[6™łX8]™ Âë‡XŹ;`ĆEĹwa¦j)ĐŚˇ{Á虣1™ŘW則©
Opětovné načtení uložených dat do R tedy není možné žádnou z výše uvedených funkcí a budeme muset použít příkazu
load(file="soubor.rda")
provede se import přímo do proměnné
Naproti tomu formát
‹ ‹ŕb```b`fbd`b2™…Á|f^ÍŔˇY lN Í–“Z–šSd€eˇ˘N™ć¦Fćž…™™šNÖäśÄbF¸qi‰É%ů
E@Ö?ě3ţ‡[Ĺ ÖÁď—ó•*Q!%±DˇL!*,í›X’š›X’™śýP!ޤLÁ×1ŔÇbÓ|vŁ:5/17ÝŹĚŮů)ůŞÔ24MśE
ůĺz0Ť`ź4 ‰˙˙˙˙Ăa?ЉziE@- 7 +CCŹ
I na velice malém souboru je vidět, že serializace do formátu
readRDS(file="soubor.rds")
vypíše přímo na konzoli obsah souboru, ale nepřiřadí jej žádné proměnné. Pokud bychom chtěli tento obsah uložit do původní proměnné Načtení dat ze schránkyUžitečným způsobem zejména při rychlé práci s malými objemy dat (např. při experimentování, ověřování výpočtů a vůbec všude tam, kde není nutné zajistit opakovatelnost analýzy) může být načítání dat přímo ze schránky operačního systému (clipboard).
Budeme-li v souladu s úvodem kapitoly předpokládat dvourozměrnou strukturu (tabulku), pak k načtení lze využít všechny zmíněné funkce
read.table("clipboard",sep=";",dec=",",colClasses="character") TIP: Všechny výše zmíněné funkce vyžadují informaci o konci řádku také pro poslední řádek tabulky, proto je při kopírování z textového formátu pomocí myši vhodné „přetáhnout“ kurzor myši až pod poslední řádek nebo použít klávesovou zkratku pro výběr veškerého obsahu souboru. Při kopírování dat z tabulkového procesoru (např. Excel) je informace o konci řádku obsažena a není třeba žádných zvláštních úkonů.
Variantou pak může být funkce Import dat z webové stránkyPokročilejším způsobem importu dat je jejich přímé načítání z webových stránek identifikovaných jejich URL adresou. V R lze pro tento účel použít většinu výše uvedených funkcí, kde je argument file nahrazen URL adresou souboru. V drtivé většině případů nicméně HTML kód výsledné webové stránky neodpovídá struktuře textového souboru vhodné pro import do dvourozměrné tabulky a výsledek importu tak nedává žádný smysl.
Částečným řešením je v takovém případě načtení celé stránky do jednorozměrného vektoru pomocí jedné z funkcí
Vhodnějším řešením tedy bude opět funkce z některého ze specializovaných balíků, která umožní přímo v rámci importu odstranit HTML značky, které využije pro uspořádání dat do datových rámců a vektorů.
Praktický balík poskytující řadu funkcí pro zpracování webových stránek v jazycích HTML a XML je distribuován pod názvem V následujícím příkladu půjde o zpracování tabulky s časovými údaji o průtoku řeky Svratky v Židlochovicích. Nejprve je potřeba stránku naparsovat se správným kódováním do proměnné stranka: Webová stránka ČHMÚPříslušná webová stránka Českého hydrometeorologického ústavu je přístupná online na adrese http://hydro.chmi.cz/hpps/popup_hpps_prfdyn.php?seq=307151.
stranka<-tmlParse(file="http://hydro.chmi.cz/hpps/popup_hpps_prfdyn.php?seq=307151",encoding="windows-1250") a následně provést zpracování všech tabulek z HTML a uložit je do seznamu nazvaného tabulky:
tabulky<-readHTMLTable(stranka) # najde vsechny tabulky a prevede je na data.frame odtud již lze konkrétní tabulku jednoduše získat zadáním pořadového čísla tabulky v původním kódu webové stránky:
tabulky[[11]]
Výsledkem je datový rámec obsahující původní tabulku, nicméně bez automatické identifikace tříd sloupců, které jsou všechny třídy
datum a čas stav [cm] průtok [m3s-1] teplota [ °C] Import dat z databázíNejpokročilejším způsobem importu dat je načítání hodnot přímo z relačních databází SQL, ke kterým je možné se připojit prostřednictvím některého z vhodných balíků. Poměrně jednoduchý a komfortní způsob nabízí API rozhraní Open Database Connectivity (ODBC), které může zprostředkovat přístup do databáze přímo z prostředí R nezávisle na programovacím jazyku a operačním systému.
V případě existujícího propojení ODBC do databáze je třeba zvolit jeden z řady vhodných balíků pro práci s ODBC v rámci R. Příjemným a snadno použitelným je balík
Prvním krokem je vytvoření funkčního připojení (proměnná třídy RODBC) k vybrané databázi. K tomu poslouží funkce
pripojeni<-odbcConnect(nazev_db,uid=jmeno,pwd=heslo)
Vytvořené připojení lze nyní použít jako první argument funkce
sqlQuery(pripojeni,"SELECT * FROM 'Tabulka' WHERE sloupec='kod_predmetu'") Třída proměnných je určena na základě datového typu sloupce v SQL databázi.
TIP: V případě použití balíku Typické problémy při importu (exportu) datV poslední části článku o importu dat do R si představíme několik typických problémů vznikajících při rutinních postupech importu dat do R. Částečně již byly metody řešení těchto problémů zmíněny výše, nicméně vzhledem k frekvenci jejich výskytu je vhodné na ně alespoň krátce upozornit ještě opakovaně. Záměna desetinné čárky a tečkyVolba znaménka tečky nebo čárky pro oddělení řádu desetin od řádu jednotek je závislá na kulturním prostředí, resp. konkrétním nastavení počítače, na kterém byla data naposledy uložena. Jazyk R pracuje na americký způsob výhradně s tečkou, proto je třeba v rámci importu vždy reálná čísla převést na formát s desetinnou tečkou:
Oddělovače vyšších řádůMimo oddělovače desetinných míst se lze setkat v datových souborech také s oddělovači vyšších řádů. V případě češtiny jde o oddělovač tisíců reprezentovaný mezerou nebo apostrofem, v anglickém prostředí se tisíce obvykle oddělují čárkou.
Situace s oddělovači tisíců je podobná výše uvedené situaci s oddělovačem desetinných míst s tím rozdílem, že v případě použití funkce Různá kódování diakritických znaků
Problém s různými druhy kódování národních znaků jednotlivých abeced má podstatně širší souvislosti, než je na tomto místě možné představit. Podstatnou informací je, že téměř všechny uvedené importní funkce umožňují zvolit kódování importovaných dat pomocí argumentu Kalendářní data
Stejně jako u oddělovačů je situace s kalendářními daty bezproblémová v případě importu z excelovských souborů nebo relačních databází. V případě ukládání dat do formátu
Nebezpečným problémem, který je často velmi obtížné opravit, je automatická konverze na datový typ datum v některých tabulkových procesorech. Reálná čísla vhodného tvaru (přesnost na jedno nebo dvě desetinná místa nepřekračující hodnotu 12) s desetinným oddělovačem tečkou jsou tak po otevření Ukázka takové nesmyslné konverze je v následující tabulce:
Článek si můžete stáhnout ve formě pdf dokumentu (840 kiB) pod tímto odkatzem. Článek na dané téma si můžete přečíst rovněž na serveru Správným směrem.cz Článek ze dne 29. 1. 2016 byl naposledy upraven dne 29. 1. 2016 a zobrazen celkem 20420×, naposledy dne 8. 10. 2025 v 19:13.
|
Autor: Jiří Herinek | Čas: 18. 12. 2018, 12:6 | |
Pro úpravu dat pro import je možné použít nový program EasyR. Program jde použít i jako konvertor dat mezi textovým souborem (.csv), MS Excel (.xlsx), SPSS formát (.sav) a formát programu R (.rds). Je k dispozici na http://www.easyr.eu | ||